/**
 * 创建人:  @author huangpeng    
 * 创建时间:  2023年05月03日 13:46
 * 项目名称:  lemon-blog-cloud
 * 文件名称:  TokenWebController
 * 文件描述:  @Description: 前台token接口
 * 公司名称:  柠檬
 *
 * All rights Reserved, Designed By 柠檬 
 * @Copyright: 2022-2023
 *
 */
package com.lemon.auth.controller;

import com.lemon.auth.form.LoginBody;
import com.lemon.auth.service.WebLoginService;
import com.lemon.common.core.constant.Constants;
import com.lemon.common.core.domain.Result;
import com.lemon.common.core.utils.JwtUtils;
import com.lemon.common.core.utils.StringUtils;
import com.lemon.common.security.auth.AuthUtil;
import com.lemon.common.security.service.TokenService;
import com.lemon.common.security.utils.SecurityUtils;
import com.lemon.system.api.domain.BiUser;
import com.lemon.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * 包名称：com.lemon.auth.controller
 * 类名称：TokenWebController
 * 类描述：前台token接口
 * 创建人：@author huangpeng
 * 创建时间：2023年05月03日 13:46
 */
@RestController
public class WebTokenController {

    @Autowired
    private TokenService tokenService;

    @Autowired
    private WebLoginService sysLoginService;

    /**
     * 前台登录
     * @Title: login
     * @Description: 前台登录
     * @param form
     * @return: R<?>
     * @throws:
     * @author: huangpeng
     * @Date: 2023/5/3 13:48
     */
    @PostMapping("loginWeb")
    public Result<?> login(@RequestBody LoginBody form)
    {
        // 用户登录
        LoginUser userInfo = sysLoginService.login(form);
        // 获取登录token
        LoginUser loginUser = new LoginUser();
        Long userId = userInfo.getBaseUser().getId();
        String userName = userInfo.getBaseUser().getUserCode();
        loginUser.setUserid(userId);
        loginUser.setUsername(userName);
        loginUser.setLoginSystem(Constants.STR_ONE);
        return Result.success(tokenService.createToken(loginUser));
    }

    /**
     * 前台登出
     * @Title: logout
     * @Description: 前台登出
     * @param request
     * @return: R<?>
     * @throws:
     * @author: huangpeng
     * @Date: 2023/5/3 13:48
     */
    @DeleteMapping("logoutWeb")
    public Result<?> logout(HttpServletRequest request)
    {
        String token = SecurityUtils.getToken(request);
        if (StringUtils.isNotEmpty(token))
        {
            String username = JwtUtils.getUserName(token);
            // 删除用户缓存记录
            AuthUtil.logoutByToken(token);
            // 记录用户退出日志
            sysLoginService.logout(username);
        }
        return Result.success();
    }

    /**
     * 前台刷新code
     * @Title: refresh
     * @Description: 前台刷新code
     * @param request
     * @return: R<?>
     * @throws:
     * @author: huangpeng
     * @Date: 2023/5/3 13:48
     */
    @PostMapping("refreshWeb")
    public Result<?> refresh(HttpServletRequest request)
    {
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser))
        {
            // 刷新令牌有效期
            tokenService.refreshToken(loginUser);
            return Result.success();
        }
        return Result.success();
    }

    /**
     * 前台注册
     * @Title: register
     * @Description: 前台注册
     * @param user
     * @return: R<?>
     * @throws:
     * @author: huangpeng
     * @Date: 2023/5/3 13:49
     */
    @PostMapping("registerWeb")
    public Result<?> register(@RequestBody BiUser user)
    {
        // 用户注册
        sysLoginService.register(user);
        return Result.success();
    }
}
